《Android 基础(三)》 MVP模式

前言

MVP,这里指的并不是篮球比赛中的MVP(最有价值球员),而是一种代码框架和设计思想,它是由MVC演变而来的。
MVP模式(Model-View-Presenter)是MVC模式的一个衍生。主要目的是为了解耦,使项目易于维护。Model 是业务逻辑和实体模型,View 是包含Presenter的引用。所要做的就是当有交互时,调用Presenter里的对应方法。通常会通过Activity实现Presenter 是负责完成View于Model间的交互,从Model里取数据,返回给View处理好的数据。

这里写图片描述

MVC模式(Model-View-Controller) 主要目的是讲显示逻辑和业务逻辑独立出来,Model 是应用程序中用于处理应用程序数据逻辑的部分,View 是应用程序中处理数据显示的部分,Controller 是应用程序中处理用户交互的部分

这里写图片描述

从构造图上可以看到最主要的差异就是

MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的

MVP使用方法

代码结构
这里写图片描述

代码内容
LoginActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class LoginActivity extends AppCompatActivity implements ILoginView {

@Bind(R.id.usernameWrapper)
TextInputLayout usernameWrapper;
@Bind(R.id.passwordWrapper)
TextInputLayout passwordWrapper;
@Bind(R.id.bt_clear)
Button btClear;
@Bind(R.id.bt_login)
Button btLogin;

private LoginPresenterCompl loginPresenterCompl;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);

loginPresenterCompl = new LoginPresenterCompl(this);


}

@OnClick({R.id.bt_clear, R.id.bt_login})
public void onClick(View view) {
String username = usernameWrapper.getEditText().getText().toString();
String password = passwordWrapper.getEditText().getText().toString();

switch (view.getId()) {
case R.id.bt_clear:
loginPresenterCompl.clearText();
break;
case R.id.bt_login:
loginPresenterCompl.doLogin(username, password);
break;
}
}

@Override
public void onLoginResult(boolean isLogged) {
if (isLogged) {
Toast.makeText(this, "Logged in Successfully", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Logged Failed", Toast.LENGTH_SHORT).show();
}
return;
}

@Override
public void onClearText() {
usernameWrapper.getEditText().setText("");
passwordWrapper.getEditText().setText("");
usernameWrapper.clearFocus();
passwordWrapper.clearFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),
0);
}
}
}

LoginActivity实现ILoginView接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public interface ILoginView {
void onLoginResult(boolean isLogged);
void onClearText();
}


```java
LoginPresenterCompl.java实现ILoginPresenter接口

```java
public class LoginPresenterCompl implements ILoginPresenter{

private ILoginView iLoginView;
Handler handler;


public LoginPresenterCompl(ILoginView loginView) {
iLoginView = loginView;
handler = new Handler(Looper.getMainLooper());
}



@Override
public void doLogin(String username, String password) {
final String tp_username = username;
final String tp_password = password;
new Thread(new Runnable() {
@Override
public void run() {
boolean isLogged = false ;
if(UserModel.isValidUser(tp_username , tp_password)) {
isLogged = true;
}
final boolean tp_isLogged = isLogged;
handler.post(new Runnable() {
@Override
public void run() {
iLoginView.onLoginResult(tp_isLogged);
}
});

}
}).start();

}

@Override
public void clearText() {
new Thread(new Runnable() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
iLoginView.onClearText();
}
});

}
}).start();

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public interface ILoginPresenter {
void doLogin(String username, String password);
void clearText();
}
```java

UserModel.java这个没有怎么使用,但是实际使用过程中不同的Model会有不同的处理方式

```java
public class UserModel {
public String username;
public String password;

public UserModel(String username, String password) {
this.username = username;
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public static boolean isValidUser(String username, String password){
return (username.equals("guagua") && password.equals("guagua"));
}
}

简约类图:
这里写图片描述

效果图

这里写图片描述 这里写图片描述

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×